package table;


import java.lang.reflect.Field;//Estudar classe
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;



/**
 *
 * @author Welisson
 */
public class TableModel extends AbstractTableModel{
    private List<?> lista;
    private Class<?> superClasse;
    private Class<?> classe;
    private List<String> colunas = new ArrayList();
    private List<String> titulos = new ArrayList();
    
    
    public TableModel(List<?> lista){
        this.lista = lista;
        
        if(!lista.isEmpty()){
            
            //classe recebe o tipo da classe do primeiro item da lista.
            this.classe = this.lista.get(0).getClass().getSuperclass();
            
            for(Field field : classe.getDeclaredFields()){
                
                this.colunas.add(field.getName()); //atribuindo os dados da classe passada para a lista de colunas
            }
            
            
            
        }
    }
    
    public TableModel(List<?> lista, String[] titulos){//altera nome das colunas
        this.lista = lista;
        if(!lista.isEmpty()){
            //classe recebe o tipo da classe do primeiro item da lista.
            this.classe = this.lista.get(0).getClass();
            this.superClasse = this.lista.get(0).getClass().getSuperclass();
        
            for(Field field : superClasse.getDeclaredFields()){
                this.colunas.add(field.getName()); //atribuindo os dados da classe passada para a lista de colunas
            }
            
            for(Field field : classe.getDeclaredFields()){
                this.colunas.add(field.getName()); //atribuindo os dados da classe passada para a lista de colunas
            }
            
            for(String aux : titulos){
                this.titulos.add(aux);
            }
        }
    }
    
    @Override
    public int getRowCount() {//qtd linhas
        return lista.size();
    }

    @Override
    public int getColumnCount() {//qtd colunas
        if(classe != null && superClasse != null){
//            System.out.println("Colunas: "+(classe.getDeclaredFields().length + superClasse.getDeclaredFields().length));
            return classe.getDeclaredFields().length + superClasse.getDeclaredFields().length;

        }else if(classe != null){
            return classe.getDeclaredFields().length ;
        }else{
            return 0;
        }
    }

    @Override
    public Object getValueAt(int linha, int coluna) {//pegar valores da tabela
        Object o = lista.get(linha);
        
        try {
            
            Field field = o.getClass().getSuperclass().getDeclaredField( colunas.get(coluna));
            
            field.setAccessible(true);
            
            if(field.getName().equals("telefone")){
                
                List<String> tel = (List<String>) field.get(o);
                
                return tel.get(0);
            }
            
            if(field.getName().equals("email")){
                List<String> email = (List<String>) field.get(o);
                
                return email.get(0);
            }

            
//            if(coluna == 8 ){
//                TableColumn colun = new TableColumn();
//                JComboBox cb = new JComboBox();
//                cb.addItem("alo");
//                colun.setCellEditor(new DefaultCellEditor(cb));
//                
//                DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
//                renderer.setToolTipText("Clique para ver mais opções");
//                colun.setCellRenderer(renderer);
//                return colun;
//            }
            return field.get(o);
        } catch (Exception e) {
            
        }
        return "";
    }

    @Override
    public void setValueAt(Object obj, int linha, int coluna) {//atribuir valor para um item da tabela
        Object o = lista.get(linha);
        
        try {
            
            Field field = o.getClass().getSuperclass().getDeclaredField((String) colunas.get(coluna));
            field.setAccessible(true);
            field.set(o,obj);//modifica o valor que esta na coluna pelo que esta vindo.
            
        } catch (Exception e) {
            
        }
        
    }

    @Override
    public String getColumnName(int indiceColuna) {//pega o nome da coluna da tabela
        if(!titulos.isEmpty()){
            return titulos.get(indiceColuna);
        }else{
            
            return colunas.get(indiceColuna);
            
        }
    }
    
    
    @Override
    public boolean isCellEditable(int i, int i1) {
        return false;
    }

    public Object get(int linha){
        return this.lista.get(linha);
    }
    
    public void setaComboBox(JTable table, TableColumn coluna) {
        //Set up the editor for the sport cells.
        JComboBox comboBox = new JComboBox();
//        for(int i = 0; i < lista.length; i++){
//            comboBox.addItem(lista[i]);
//        }
        comboBox.addItem("teste 1");
        comboBox.addItem("teste 2");
        comboBox.addItem("teste 3");
        coluna.setCellEditor(new DefaultCellEditor(comboBox));
 
        //Set up tool tips for the sport cells.
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setToolTipText("Clique para ver mais opções");
        coluna.setCellRenderer(renderer);
    }
}
